import * as mockjs from "mockjs";
import * as cryptoJS from "crypto-js";
import * as moment from "moment";

const IHelper = new (class {
  sleep(milliseconds: number): Promise<number> {
    return new Promise<number>((resolve) => {
      setTimeout(() => {
        resolve(1);
      }, milliseconds);
    });
  }

  hash(len?: number, option?: { mixed?: boolean }): string {
    const length: number = len ? len : 6;
    const lower: string = "abcdefghighlmnopqrstuvwxyz";
    const upper: string = lower.toUpperCase();
    const number: string = "0123456789";
    const symbol: string = "!@?$%^&*";
    const pool: string = `${number}${upper}${lower}${option?.mixed ? symbol : ""}`;
    return (
      mockjs.Random.string(lower, 1) + mockjs.Random.string(pool, length - 1)
    );
  }

  md5(l: string): string {
    return cryptoJS.MD5(l).toString();
  }

  unix(): number {
    return moment().unix();
  }

  convertToQueryString(params: object, ignoreEncode?: boolean): string {
    return Object.keys(params)
      .map(
        (k) =>
          `${k}=${ignoreEncode ? params[k] : encodeURIComponent(params[k])}`,
      )
      .join("&");
  }

  parseQueryStr(queryStr: string): { [prop: string]: string } {
    const obj: { [prop: string]: string } = {};
    queryStr.split("&").forEach((e) => {
      const [k, v] = e.split("=");
      obj[k] = decodeURIComponent(v);
    });
    return obj;
  }

  timeFormatted(format?: string) {
    return moment().format(format || "YYYY-MM-DD HH:mm:ss");
  }

  getArray(len: number): number[] {
    return Array.from(new Array(len).keys());
  }
  getUserAgent(): string {
    const userAgentsPool = [
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
      'Opera/8.0 (Windows NT 5.1; U; en)',
      'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
      'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
      'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
      'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 ',
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
      'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
      'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
      'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
      'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
      'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
      'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
      'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0) ',
    ]
    return userAgentsPool.random()
  }
})();

export default IHelper;
